package br.com.android.aluno.view;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.TextView;
import br.com.android.aluno.enums.Sexo;
import br.com.android.aluno.model.Aluno;
import br.com.android.aluno.util.Constantes;
import br.com.android.aluno.util.UtilFile;

public abstract class FormularioActivity extends Activity implements OnClickListener {
    
    // Widgets
	private Button btSalvar = null;
	private Spinner spCursos = null;
	private ImageView ivFotoAluno = null;
	private TextView tvConteudoId = null;
	private EditText etNome = null;
	private EditText etTelefone = null;
	private EditText etEmail = null;
	private EditText etEndereco = null;
	private RadioButton rbMasculino = null;
	private RadioButton rbFeminino = null;
	private CheckBox chkMatriculado = null;

	// Lista de cursos para popular o spinner
	public static final String [] CURSOS = {"Inglês", "Informática", "Administração", "Medicina", "Direito", "Enfermagem"};
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
                
        // Seta o click no botao
        getBtSalvar().setOnClickListener(this);
        
        // Seta o click na imagem para abrir a camera
        getIvFoto().setOnClickListener(this);
        
		// Preenche o spinner com uma lista de cursos
        getSpCursos().setAdapter(getCursosAdapter());
    }

	public abstract void onClick(View v);
	
	/**
	 * Retorna uma instancia do objeto aluno conforme que o foi digitado pelo usuario
	 * @return Aluno
	 */
	protected Aluno getAluno() {
		Aluno aluno = new Aluno();
		
		try {
			aluno.setId(Integer.parseInt(getTvConteudoId().getText().toString()));
		} catch (NumberFormatException e) {
			aluno.setId(0);
		}
		aluno.setNome(getEtNome().getText().toString());
		aluno.setTelefone(getEtTelefone().getText().toString());
		aluno.setEmail(getEtEmail().getText().toString());
		aluno.setEndereco(getEtEndereco().getText().toString());
		aluno.setCurso(getSpCursos().getSelectedItem().toString());
				
		File fotoPath = getFileAluno(aluno);
		aluno.setFotoPath(fotoPath);
				
		Sexo sexo = Sexo.FEMININO;	
		if(getRbMasculino().isChecked()){
			sexo = Sexo.MASCULINO;
		}
		 
		aluno.setSexo(sexo);
		aluno.setMatriculado(getChkMatriculado().isChecked());
		
		return aluno;
	}
	
	private File getFileAluno(Aluno aluno) {
		String nomeArq = "";
		
		if(aluno.getId() < 10){
			nomeArq += "00"+aluno.getId();
		} else if(aluno.getId() < 100){
			nomeArq += "0"+aluno.getId();
		} else{
			nomeArq += "" + aluno.getId();
		}
		
		File fileImg = new File(Constantes.DIR_ALUNO_APP, nomeArq + ".png");
		
		if(fileImg.exists()){
			return fileImg;
		}
		
		return null;
	}

	public void setAluno(Aluno aluno) {
		if(aluno == null){
			Log.w("aluno", "[FormularioActivity - setAluno(Aluno)] Objeto Aluno é nulo!");
			return;
		}
		
		// Mostra os dados no aluno no LogCat
//		Log.w("aluno", aluno.toString());
		
		Bitmap bitmap = UtilFile.decodeFile(getFileAluno(aluno));
		if(bitmap != null){
			getIvFoto().setImageBitmap(bitmap);
		}
		
		getTvConteudoId().setText(String.valueOf(aluno.getId()));
		getEtNome().setText(aluno.getNome());
		getEtTelefone().setText(aluno.getTelefone());
		getEtEmail().setText(aluno.getEmail());
		getEtEndereco().setText(aluno.getEndereco());
		getSpCursos().setSelection(getPosition(aluno.getCurso()));
		getRbMasculino().setChecked(aluno.getSexo() == Sexo.MASCULINO ? true : false);
		getRbFeminino().setChecked(aluno.getSexo() == Sexo.FEMININO ? true : false);
		getChkMatriculado().setChecked(aluno.isMatriculado());
	}

	/**
	 *  Obtem a posicao do curso no spinner
	 * @param curso
	 * @return posicao
	 */
	private int getPosition(String curso) {
		for (int i = 0; i < FormularioActivity.CURSOS.length; i++) {
			String item = FormularioActivity.CURSOS[i];
			if(item.equalsIgnoreCase(curso)){
				return i;
			}
		}
		return 0;
	}
	
	@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {    	
		switch (requestCode) {
			case 101:
				if(data != null){
					Bundle bundle = data.getExtras();
					if(bundle != null){
						// Recupera o bitmap retornado pela camera
						Bitmap bitmap = (Bitmap) bundle.get("data");
						
						// Atualiza a imagem na tela
						getIvFoto().setImageBitmap(bitmap);
						
						// Salva a imagem temporaria no SDCard
						UtilFile.salvarImageTempBitmap(bitmap);
					}
				}
				break;
		}
	}
	


    /**
     * Renomeia o nome do arquivo, pois eh salvo com nome temporario
     * Se a imagem ja existe, ele apagara e salvara a atual
     * 
     * @param aluno
     */
	public File renomeiaFoto(Aluno aluno) {				
		File newPath = null;
		
		if(Constantes.TEMP_FILE_IMG.exists()){
			String nomeArq = "";
			
			if(aluno.getId() < 10){
				nomeArq += "00"+aluno.getId();
			} else if(aluno.getId() < 100){
				nomeArq += "0"+aluno.getId();
			} else{
				nomeArq += "" + aluno.getId();
			}
			
			newPath = new File(Constantes.DIR_ALUNO_APP, nomeArq + ".png");
			
			if(newPath.exists()){
				newPath.delete();			
			}
			
			Constantes.TEMP_FILE_IMG.renameTo(newPath);
		}	
		
		return newPath;
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_BACK){
			if(Constantes.TEMP_FILE_IMG.exists()){
				Constantes.TEMP_FILE_IMG.delete();
			}
		}
		
		return super.onKeyDown(keyCode, event);
	}
	
	/**
	 * Cria um adapter para o spinner
	 */
	protected ArrayAdapter<String> getCursosAdapter() {
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_spinner_item, CURSOS);
		
		return adapter;
	}
	
	

    /****************************************************************************
     * 
     * Obtem as referencias aos widgets criando uma instancia unica
     *  
     */
	
	protected Spinner getSpCursos() {
		if(spCursos == null){
			spCursos  = (Spinner) findViewById(R.id.activity_formulario_spCursos);
		}
		return spCursos;
	}

	protected Button getBtSalvar() {
		if(btSalvar == null){
			btSalvar = (Button) findViewById(R.id.activity_formulario_btSalvar);
		}
		return btSalvar;
	}
	
	protected CheckBox getChkMatriculado() {
		if(chkMatriculado == null){
			chkMatriculado = (CheckBox) findViewById(R.id.activity_formulario_chkMatriculado);
		}
		return chkMatriculado;
	}

	protected RadioButton getRbFeminino() {
		if(rbFeminino == null){
			rbFeminino = (RadioButton) findViewById(R.id.activity_formulario_rbFeminino);
		}
		return rbFeminino;
	}

	protected RadioButton getRbMasculino() {
		if(rbMasculino == null){
			rbMasculino = (RadioButton) findViewById(R.id.activity_formulario_rbMasculino);
		}
		return rbMasculino;
	}

	protected EditText getEtEndereco() {
		if(etEndereco == null){
			etEndereco = (EditText) findViewById(R.id.activity_formulario_etEndereco);
		}
		return etEndereco;
	}

	protected EditText getEtEmail() {
		if(etEmail == null){
			etEmail = (EditText) findViewById(R.id.activity_formulario_etEmail);
		}
		return etEmail;
	}

	protected EditText getEtTelefone() {
		if(etTelefone == null){
			etTelefone = (EditText) findViewById(R.id.activity_formulario_etTelefone);
		}
		return etTelefone;
	}

	protected EditText getEtNome() {
		if(etNome == null){
			etNome = (EditText) findViewById(R.id.activity_formulario_etNome);
		}
		return etNome;
	}

	protected TextView getTvConteudoId() {
		if(tvConteudoId == null){
			tvConteudoId = (TextView) findViewById(R.id.activity_formulario_tvConteudoId);
		}
		return tvConteudoId;
	}

	protected ImageView getIvFoto() {
		if(ivFotoAluno == null){
			ivFotoAluno = (ImageView) findViewById(R.id.activity_formulario_ivFotoAluno);
		}		
		return ivFotoAluno;
	}
}